#ifndef SYN_DATA_H
#define SYN_DATA_H

#include "main.h" //本模块是通用应用逻辑，不依赖底层，底层使用适配器适配不同的硬件平台

//功能
//1、utc时统
//	接受同步模块的脉冲和通信输入，提取秒跳变和pps跳变，将其中发生时间最近的两个联系起来，得到本地时统。秒间pps不管
//2、包时间戳
//	需要根据包的整周期触发特性给时间戳，而不是完成时的时间
//	采样频率是pps频率的整数倍，pps对TIM做复位，使AD的完成中断必是TIM整周期，只需考虑tick即可
//
//注意：系统时间应与触发时间用同一个定时器

#define SYN_PACK_N	(128) //同步数据帧中的数据点数
#define SYN_PACK_CH	(1) //同步数据帧中的通道数
#define SYN_PACK_SIZE	(SYN_PACK_N*SYN_PACK_CH) //同步数据帧中的元素数

#define SAMPLE_F	(12800) //采样频率，Hz
#define SAMPLE_T_01US	(1000*1000*10.0f/SAMPLE_F) //采样点间隔的0.1us计数值

#pragma pack(1) 
typedef struct //
{
	u32 sec; //数据秒
	u32 us01; //数据0.1us数
} SYNT_TIME; //系统时间结构
#pragma pack() 

#pragma pack(1) 
typedef struct //256+14=270Byte
{
	u8 syn; //0xaa
	u8 type; //类型，1
	u32 utc; //数据秒
	u32 us01; //秒内时间, 单位0.1us
	u8 ch_n; //通道数量
	u8 len; //等间隔的数据点数
	u16 d[SYN_PACK_SIZE]; //等间隔点数据，先做一个通道的
	u8 res;
	u8 sum; //从0字节开始计算
} S_SYN_10MS_PACK; //同步数据帧，共10ms的数据
#pragma pack() 
//主要内存消耗：<3KB
//	1、发送缓存：一个S_SYN_10MS_PACK，1通道270字节，2通道526字节
//	2、串口发送缓存：1KB
//	3、DMA双缓存：1通道512字节，2通道1024字节

//外部接口
extern void synd_send(S_SYN_10MS_PACK &d); //发送函数，非阻塞，要在缓存有效期(10ms)内发完

//对外提供的变量
extern SYNT_TIME synd_time; //系统时间，其中秒内为守时的整周期数
extern u32 synd_tick; //系统时间中秒内的tick累加数
extern S_SYN_10MS_PACK synd_buf; //双缓存
extern u16 synd_ring_buf[SYN_PACK_SIZE * 2]; //接收AD数据的环形缓存
extern u32 synd_buf_proc_ind; //缓存处理指示

//需要应用层调用的函数
void synd_ini(void);
void synd_syn_in(void); //时统通信数据输入

//需要硬件层调用的中断服务入口
void synd_pps_INTR(void); //处理pps中断(10Hz)
void synd_TIM_INTR(void); //处理定时器单个周期中断(12.8KHz)
void synd_in_half_INTR(u32 proc_ind); //输入0为DMA半满，1为完成

#endif
